package com.foreknow.demo9;

import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 异常（Exception）
 * 1.所有异常的根父类是Throwable
 * 2.Throwable有两个直接的子类：Error（错误）
 * 非检查性异常也称之为RuntimeException
 * 如何处理异常：try...catch
 * 语法：
 *      try {
 *          //有可能出现异常的代码
 *      }catch (Exception e){
 *          //处理异常
 *      }finally {
 *          //无论try块中有无异常，最终都会执行finally块中的代码
 *      }
 * throw：表示抛出异常（异常的声明），通过这个关键字写到方法的后面
 * 语法：public void m1() throws 异常类型{
 *
 * }
 * 它可以表示为当前的方法中有可能会产生异常，但是在这个方法中我们不去处理，谁调用这个方法谁处理
 *
 */
public class ExceptionDemo {
    public void m1() throws Exception {
        System.out.println("throws Exception");
    }
/*    public void m2(){
        m1();
    }*/
    public static void main(String[] args){
        ExceptionDemo demo = new ExceptionDemo();
        try {
            demo.m1();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            //有可能出现异常的代码
            //insert update delete
            //提交事物
            int[] array = {1,2,3,4,5,6};
            for (int i = 0;i<=array.length;i++){
                System.out.println(array[i]);
            }
            System.out.println("如果以上代码出现异常，那么之后的语句将无法执行");
        }catch (Exception e){
            //回滚事物
            //处理异常
            System.out.println(e.getMessage());
        }finally {
            //无论try块中有无异常，最终都会执行finally块中的代码
            System.out.println("finally......");
        }
/*        int[] array = {1,2,3,4,5,6};
        for (int i = 0;i<=array.length;i++){
            System.out.println(array[i]);
        }*/
        System.out.println("如果以上代码出现异常，那么之后的语句将无法执行");

        //一个try后面可以有多个catch，catch中的错误类型规则为由小（子类型）到大类型
        try {
            Class.forName("");
            DriverManager.getConnection("","","");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
